home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt85jun.lbr / LOWLIB.AQM / LOWLIB.ASM
Assembly Source File  |  1985-09-15  |  8KB  |  318 lines

  1.         .nopatchlist
  2.         .title "     LOWLIB -- ASSEMBLY ROUTINES"
  3. ;
  4. ;       macros
  5. ;
  6.         .macro  pop                  ; pops tos, tos+1 into %1, %1+1
  7.         pla
  8.         sta     %1
  9.         pla
  10.         sta     %1+1
  11.         .endm
  12. ;
  13.         .macro  popb             ; pops tos into %1 -- discards tos+1
  14.         pla
  15.         sta     %1
  16.         pla
  17.         .endm
  18. ;
  19.         .macro  push             ; pushes %1,%1+1 onto stack
  20.         lda     %1+1
  21.         pha
  22.         lda     %1
  23.         pha
  24.         .endm
  25. ;
  26.         .macro  pushb            ; pushes 0,%1 onto stack
  27.         lda     #00
  28.         pha
  29.         lda     %1
  30.         pha
  31.         .endm
  32. ;
  33.         .macro  clrstk           ; clear stack for function call
  34.         pla
  35.         pla
  36.         pla
  37.         pla
  38.         .endm
  39. ;
  40.         .nomacrolist
  41. ;
  42. ;
  43.         .func   shr,2
  44. ;
  45. ;-----------
  46. ;
  47. ;       function Shr(Int,Cnt : Integer) : Integer
  48. ;
  49. ;           does integer shift right Cnt times
  50. ;
  51. ;-----------
  52. ;
  53. return  .equ     00
  54. count   .equ     02
  55. int     .equ     08
  56. ;
  57. ;       save parameters and clear stack for function return
  58. ;
  59.         pop      return           ; save return address
  60.         clrstk                    ; clear saved space on stack
  61.         popb     count            ; get count value for loop (byte)
  62.         ldy      count            ; check value of count
  63.         beq      quick_exit       ; if count = 0, then leave
  64.         pop      int              ; save integer
  65. ;
  66. ;       set up for loop -- shift right until done
  67. ;
  68.         rol      a                ; preserve sign of integer
  69. loop    php                       ; save flags (with sign)
  70.         ror      int+1            ; do shift
  71.         ror      int              ; for both bytes
  72.         plp                       ; restore flags
  73.         dey                       ; decrement count
  74.         bne      loop             ; continue until done
  75. ;
  76. ;       return integer and exit
  77. ;
  78.         push     int              ; if shifted, push int back on stack
  79. quick_exit
  80.         push     return           ; restore return address
  81.         rts                       ; and leave
  82. ;
  83.         .func    shl,2
  84. ;
  85. ;---------------------
  86. ;
  87. ;       function Shl(Int,Cnt : Integer) : Integer;
  88. ;
  89. ;          does unsigned integer shift left Cnt times
  90. ;
  91. ;---------------------
  92. ;
  93. return  .equ     00
  94. count   .equ     02
  95. int     .equ     08
  96. ;
  97. ;       save parameters, etc.
  98. ;
  99.         pop      return           ; save return address, etc.
  100.         clrstk
  101.         popb     count
  102.         ldy      count
  103.         beq      quick_exit
  104.         pop      int
  105. ;
  106. ;       shift left until done (feed 0's into msb)
  107. ;
  108. loop    asl      int
  109.         rol      int+1
  110.         dey
  111.         bne      loop
  112. ;
  113. ;       return integer and exit
  114. ;
  115.         push     int
  116. quick_exit
  117.         push     return
  118.         rts
  119. ;
  120.         .func    iand,2
  121. ;
  122. ;----------------------
  123. ;
  124. ;       function IAnd(Int1,Int2 : Integer) : Integer;
  125. ;
  126. ;         returns (Int1 AND Int2)
  127. ;
  128. ;----------------------
  129. ;
  130. return  .equ     00
  131. int2    .equ     06
  132. int1    .equ     08
  133. ;
  134. ;
  135.         pop      return              ; save return address
  136.         clrstk                       ; clear stack
  137.         pop      int2                ; save parms
  138.         pop      int1
  139.         lda      int2+1              ; get upper byte of Int2
  140.         and      int1+1              ; AND with upper byte of Int1
  141.         pha                          ; and save on stack
  142.         lda      int2                ; ditto with lower bytes
  143.         and      int1
  144.         pha
  145.         push     return
  146.         rts
  147. ;
  148.         .func    ior,2
  149. ;
  150. ;----------------------
  151. ;
  152. ;       function IOr(Int1,Int2 : Integer) : Integer;
  153. ;
  154. ;         returns (Int1 OR Int2)
  155. ;
  156. ;----------------------
  157. ;
  158. return  .equ     00
  159. int2    .equ     06
  160. int1    .equ     08
  161. ;
  162. ;
  163.         pop      return              ; save return address
  164.         clrstk                       ; clear stack
  165.         pop      int2                ; save parms
  166.         pop      int1
  167.         lda      int2+1              ; get upper byte of Int2
  168.         ora      int1+1              ; OR with upper byte of Int1
  169.         pha                          ; and save on stack
  170.         lda      int2                ; ditto with lower bytes
  171.         ora      int1
  172.         pha
  173.         push     return
  174.         rts
  175. ;
  176.         .func    ixor,2
  177. ;
  178. ;----------------------
  179. ;
  180. ;       function IXor(Int1,Int2 : Integer) : Integer;
  181. ;
  182. ;         returns (Int1 XOR Int2)
  183. ;
  184. ;----------------------
  185. ;
  186. return  .equ     00
  187. int2    .equ     06
  188. int1    .equ     08
  189. ;
  190. ;
  191.         pop      return              ; save return address
  192.         clrstk                       ; clear stack
  193.         pop      int2                ; save parms
  194.         pop      int1
  195.         lda      int2+1              ; get upper byte of Int2
  196.         eor      int1+1              ; XOR with upper byte of Int1
  197.         pha                          ; and save on stack
  198.         lda      int2                ; ditto with lower bytes
  199.         eor      int1
  200.         pha
  201.         push     return
  202.         rts
  203. ;
  204.         .func    low
  205. ;
  206. ;---------------------
  207. ;
  208. ;       function Low(Int : Integer) : Integer
  209. ;
  210. ;          return low-order byte of Int
  211. ;
  212. ;--------------------
  213. ;
  214. return  .equ     00
  215. int     .equ     02
  216. ;
  217. ;
  218.         pop      return               ; save return address
  219.         clrstk                        ; and clear stack
  220.         popb     int                  ; save lower byte of Int
  221.         pushb    int                  ; push it back on
  222.         push     return               ; restore return address
  223.         rts
  224. ;
  225.         .func    high
  226. ;
  227. ;---------------------
  228. ;
  229. ;       function High(Int : Integer) : Integer
  230. ;
  231. ;          return high-order byte of Int
  232. ;
  233. ;--------------------
  234. ;
  235. return  .equ     00
  236. int     .equ     02
  237. ;
  238. ;
  239.         pop      return               ; save return address
  240.         clrstk                        ; and clear stack
  241.         pop      int                  ; save Int
  242.         pushb    int+1                ; push high-order byte back on
  243.         push     return               ; restore return address
  244.         rts
  245. ;
  246.         .func    swap
  247. ;
  248. ;---------------------
  249. ;
  250. ;       function Swap(Int : Integer) : Integer
  251. ;
  252. ;         swaps high and low byte of Int
  253. ;
  254. ;--------------------
  255. ;
  256. return  .equ     00
  257. ;
  258. ;
  259.         pop      return               ; save return address
  260.         clrstk                        ; and clear stack
  261.         pla                           ; get lower byte
  262.         tax                           ; and save in X-register
  263.         pla                           ; get upper byte
  264.         tay                           ; and save in Y-register
  265.         txa                           ; push back on stack in swapped order
  266.         pha
  267.         tya
  268.         pha
  269.         push     return               ; restore return address
  270.         rts
  271. ;
  272.         .proc    create,2
  273. ;
  274. ;---------------------
  275. ;
  276. ;       procedure Create(Addr : Integer; var Pointer)
  277. ;
  278. ;           sets Pointer to Addr
  279. ;
  280. ;--------------------
  281. ;
  282. return  .equ     00
  283. pointer .equ     02
  284. ;
  285. ;
  286.         pop      return               ; save return address
  287.         pop      pointer              ; get addr of pointer
  288.         ldy      #00                  ; set up for indexing
  289.         pla                           ; move address into pointer
  290.         sta      (pointer),y
  291.         pla
  292.         iny                           ; increment to next location
  293.         sta      (pointer),y
  294.         push     return               ; restore return address
  295.         rts
  296. ;
  297.         .func    address,1
  298. ;
  299. ;---------------------
  300. ;
  301. ;       function Address(var Item)
  302. ;
  303. ;           return address of any variable
  304. ;
  305. ;--------------------
  306. ;
  307. return  .equ     00
  308. ;
  309. ;
  310.         pop      return               ; save return address
  311.         clrkstk                       ; clear stack but leave address of Item
  312.                                       ;   on it as function result
  313.         push     return               ; restore return address
  314.         rts
  315. ;
  316.         .end
  317.  
  318.